
"""
最近在一个编程中，需要实现一个功能，就是给定集合，如何列出它的所有子集。有兴趣的读者不妨自己想想怎么做？

在找资料的时候，发现了一个很奇妙的方法。
这个奇妙的方法就是利用二进制，灵感源于：nn个元素的集合的所有子集有2n2n个，而nn位数的二进制数刚好也有2n2n个。因此，只需要遍历前2n2n个数，然后转为二进制，接着逐位读取，遇到1则挑选出原来集合对应的元素。如果用python实现，那么代码是非常简洁的：
"""

import numpy as np

n = 5
s = np.array(range(n))
for i in range(2**n):
  e = list(bin(i))[2:]
  e = np.array(e) == '1'
  print(s[n-len(e):][e])
